package com.hb.config;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.FilterRegistration;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;

/**
 * 1、如果我们想注册其他自定义的 Servlet、Filter 或 Listener 的话，借助自定义初始化器类即可（WebApplicationInitializer 的实现类）。
 * 2、基于 Java 的初始化器（initializer）的一个好处就在于我们可以定义任意数量的初始化器类。因此，如果我们想往 Web 容器中注册其他组件的话，只需创建一个新的初始化器就可以了。
 * 最简单的方式就是实现 Spring 的 WebApplicationInitializer 接口
 * 3、下面的类展现了如何创建 WebApplicationInitializer 实现并注册一个 Servlet，该类是相当基础的 Servlet 注册初始化器类
 * 4、WebApplicationInitializer 提供了一种将应用部署到支持 Servlet 3.0 的容器中的通用方式，实现在 Java 中注册 Servlet、 Filter 和 Listener，就是在 onStartup() 方法
 * 中注册自定义的 Servlet，Filter 和 Listener
 */
public class MyServletInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // 注册一个自定义 Servlet
        Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
        // 将注册的自定义 Servlet 映射到一个路径上
        // 我们也可以通过这种方式来手动注册 DispatcherServlet。（但这并没有必要，因为 AbstractAnnotationConfigDispatcherServletInitializer
        // 没用太多代码就将这项任务完成得很漂亮。）
        myServlet.addMapping("/custom/**");

        // 注册自定义 Filter
        // 我们可以创建新的 WebApplicationInitializer 实现来注册 Listener 和 Filter，或者就在一个 WebApplicationInitializer 实现中注册 Servlet，Filter 和 Listener
//        FilterRegistration.Dynamic filter = servletContext.addFilter("myFilter", MyFilter.class);
        // 添加 Filter 的映射路径
//        filter.addMappingForUrlPatterns(null, false, "/custom/**");

        // 用 Servlet 初始化类的方式来给 DispatcherServlet 指定 multipart 的配置
        // 如果使用 AnnotationConfigDispatcherServletInitializer 或 AbstractDispatcher-ServletInitializer 的话，我们就不需要像下面这样手动创建 DispatcherServlet
        // 并将其注册到 Servlet 上下文中
        DispatcherServlet ds = new DispatcherServlet();
        Dynamic registration = servletContext.addServlet("appServletDs", ds);
        registration.addMapping("/ds/");
        // 在 ServletRegistration 上调用 setMultipartConfig() 方法，传入一个 MultipartConfigElement 实例
        registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
    }
}
